package br.com.localfloripa.dao;

import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.Query;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;

import br.com.localfloripa.entities.Cliente;
import br.com.localfloripa.entities.Estado;

@Named("estadoDao")
@Scope("singleton")
public class EstadoDao extends DaoManager<Estado> {
	
	private static final Logger log = LoggerFactory.getLogger(EstadoDao.class);
	
	@Inject
	@Named("representanteDao")
	private RepresentanteDao representanteDao;
	
	public Estado findById(Integer idEstado) throws Exception {
		return em.find(Estado.class, idEstado);
	}
	
	public List<Estado> listEstadosComAnunciosOrdemSigla() throws Exception {
		
		Query query = em.createQuery("SELECT DISTINCT(uf) FROM Estado uf JOIN uf.municipios m JOIN m.enderecos e JOIN e.empresas emp JOIN emp.anuncio a ORDER BY uf.sigla");		
		return (List<Estado>) query.getResultList();		
	}
	
	public List<Estado> listEstadosByCliente(Cliente cliente) throws Exception {
		
		String jpql = null;
		if (representanteDao.findById(cliente.getId()) != null) { // corretor
			jpql = "SELECT DISTINCT(uf) FROM Estado uf JOIN uf.municipios m JOIN m.enderecos e JOIN e.empresas emp JOIN emp.anuncio a JOIN a.representante r WHERE r.id = :idCliente AND a.ramo.id = 4 ORDER BY uf.sigla";
		} else {
			jpql = "SELECT DISTINCT(uf) FROM Estado uf JOIN uf.municipios m JOIN m.enderecos e JOIN e.empresas emp JOIN emp.anuncio a JOIN a.cliente c WHERE c.id = :idCliente AND a.ramo.id = 4 ORDER BY uf.sigla";
		}		
		Query query = em.createQuery(jpql);
		query.setParameter("idCliente", cliente.getId());
		return (List<Estado>) query.getResultList();
	}
	
	public List<Estado> listEstadosOrdemSigla() throws Exception {
		
		Query query = em.createQuery("SELECT uf FROM Estado uf ORDER BY uf.sigla");		
		return (List<Estado>) query.getResultList();
	}
	
	public Estado findPorSigla(String sigla) throws Exception {
		
		Estado estado = new Estado();
		
		Query query = em.createQuery("SELECT uf FROM Estado uf WHERE uf.sigla = :sigla");
		query.setParameter("sigla", sigla);
		
		List<Estado> estados = query.getResultList();
		if (!estados.isEmpty()) {
			estado = estados.get(0);
		}		
		return estado;		
	}

}
